import os
import pandas as pd
import numpy as np
import datetime
import joblib


# 2025-09-29  星期一 start
#======================================================================================================
#Q os.path
# 获取当前文件的绝对路径
curr_path = os.path.dirname(os.path.abspath(__file__))
print(curr_path)

# 获取当前文件的绝对路径
curr_path = os.path.abspath(__file__)
print(curr_path)

# 获取当前文件的绝对路径
curr_path = os.path.abspath('.')
print(curr_path)

# 获取当前文件的绝对路径
curr_path = os.path.abspath('..')
print(curr_path)

# 获取当前文件的绝对路径
curr_path = os.path.abspath('../..')
print(curr_path)

# 获取当前文件的绝对路径
curr_path = os.path.abspath('../../..')
print(curr_path)

# 执行文件的路径
curr_path = os.path.abspath(os.path.dirname(__file__))
print(curr_path)

# 执行文件的路径 cwd
curr_path = os.getcwd()
print(curr_path)


tmp_path = os.path.join(curr_path, 'data', 'data_with_indicators', f'特保评估可行性方案评分汇总表-自然人.xlsx')
print(tmp_path)

#======================================================================================================
#Q read_excel
# 从临时路径读取Excel文件，并跳过第一行数据
# skiprows=1参数用于跳过文件中的第一行，通常用于跳过Excel文件的标题行
cust_kp_p = pd.read_excel(tmp_path, skiprows=1)

#======================================================================================================
#Q lambda .astype()
cust_kp_p_cid = tuple(cust_kp_p[lambda x:~x['是否有强平记录'].astype(str).str.contains('是')]
                      [lambda x:~x['黑/灰名单灰名单客户'].astype(str).str.contains('是')]
                      [lambda x:~x['黑/灰名单黑名单客户'].astype(str).str.contains('是')]
                      [lambda x:~x['反洗钱等级（高风险及禁止类）'].astype(str).str.contains('是')]
                      [lambda x:~x['信用情况（失信查询存在负面记录）'].astype(str).str.contains('是')]
                      [lambda x:~x['交割/行权违约（违约方或我司待履约）'].astype(str).str.contains('是')]
                      ['客户账户'].astype(str).unique())
'''
这是一段链式筛选操作，让我们分解来看：

lambda x: 是匿名函数语法，x 代表传入的DataFrame
x['列名'].astype(str) 将指定列转换为字符串类型
.str.contains('是') 检查字符串是否包含"是"
~ 是逻辑非运算符，表示取反（即不包含"是"的记录）
[条件筛选] 是pandas的链式索引，每次筛选都会返回一个新的DataFrame
最后选取['客户账户']列，转换为字符串并去重，最后转为元组(tuple)
'''
#======================================================================================================
#Q 元组
# cust_good_cid = cust_kp_p_cid + cust_kp_e_cid
# cust_bad_cid = cust_fb_cid + cust_hr_cid + cust_df_cid + cust_ex_cid
# 使用元组的加法操作合并多个元组

#======================================================================================================
#Q sql
# sql = f'''
# select pcd.*, pfcd.*
# from 
#     ads.ptat_futures_customer_df pfcd
# left join 
#     ads.ptat_customer_df pcd
# on pfcd.cid=pcd.cid
# where pcd.cid in {cust_good_cid + cust_bad_cid}
#     --and pcd.cust_type=0    --自然人
# '''
'''
使用三重引号定义多行字符串
f-string中直接插入元组，SQL会自动展开为逗号分隔的值列表
-- 表示SQL注释


'''
#======================================================================================================
#Q 取不重复值
# cust_data = cust_data.loc[:, ~cust_data.columns.duplicated()]
'''
loc[:, ...] 使用pandas的位置索引器，冒号表示选择所有行
~cust_data.columns.duplicated() 创建布尔掩码，~ 取反，选出不重复的列名
整体作用是去除重复的列

'''

# 检查列名是否重复
# cust_data.columns.duplicated() 
'''
示例：
columns = ['A', 'B', 'C', 'A', 'D', 'E']
mask = columns.duplicated()
print(mask)
输出：
[False False False  True False False]

'''
#======================================================================================================
#Q np.whre()
# cust_data['if_retain'] = 0
# cust_data['if_retain'] = np.where(cust_data['cid'].isin(list(cust_good_cid)), 1, 0)
'''
第一行创建新列并初始化为0
np.where(condition, value_if_true, value_if_false) 是numpy的条件判断函数
isin() 检查每行的cid是否在good客户列表中
如果在则标记为1（保留客户），否则为0（不保留客户）
'''
#======================================================================================================
#Q joblib
# joblib.dump(cust_data, tmp_path)
# 使用joblib序列化保存DataFrame对象到磁盘

#======================================================================================================
#Q 去重
# df2.drop_duplicates(subset=['id'], keep='first', inplace=True)
'''
drop_duplicates() 去除重复行
subset=['id'] 指定基于'id'列判断重复
keep='first' 保留第一次出现的记录
inplace=True 直接修改原DataFrame而不返回新的

示例
df = pd.DataFrame({'id': [1, 2, 2, 3, 4, 4],
                   'name': ['Alice', 'Bob', 'Bob', 'Charlie', 'David', 'David']})
df.drop_duplicates(subset=['id'], keep='first', inplace=True)
print(df)
输出：
   id     name
0   1    Alice
1   2      Bob
3   3  Charlie
4   4    David

 '''
#======================================================================================================
#Q pd.merge
# df3 = pd.merge(df1, df2, how='inner', on='id')

'''
pd.merge() 执行两个DataFrame的合并操作
how='inner' 指定内连接方式
on='id' 指定基于'id'列进行连接
'''

#======================================================================================================
#Q 

#======================================================================================================
#Q 


#======================================================================================================
#Q 


# 2025-09-29 10:56:40 星期一 end
# --------------------------------------------------------------------------------------------------------
